# coding=utf-8

import os;
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "auto_sale_spider.settings")  # NoQA
import django;
django.setup()  # NoQA

from spider.models import *
import sys
from html_downloader_selenium import HtmlDownloader
from html_parser_selenium import HtmlParser
import logging
from spider.Controller.product_controller import *

reload(sys)
sys.setdefaultencoding('utf-8')

# import sys;
# sys.path.append('../../')  # NoQA



class SpiderMain(object):
    def __init__(self):
        # self.urls = url_manager.UrlManager()
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()
        # self.outputer = html_outputer.HtmlOutputer()
        # 用来存储爬虫需要的url
        # self.shop_urls = []
        # self.product_urls = []
        self.controller = ProductController()

    # 将content写入名为fileName的文件中
    def writeInFile(self, fileName, content):
        f = open(fileName, 'w')
        f.write(content)
        f.close()

    # 爬取商品详细信息
    def craw_product_detail(self):
        logging.info('start craw_product_detail')
        # 获取未爬取细节的商品
        no_detail_product_list = Product.objects.filter(is_crawled_detail=False)
        # 爬取商品详细信息
        for product in no_detail_product_list:
            self.downloader.download_and_parse_product_detail(product)

        logging.info('end craw_product_detail')

    def craw_one_shop_product_detail(self, shop):
        logging.info('start craw_product_detail')
        # 获取未爬取细节的商品
        no_detail_product_list = Product.objects.filter(is_crawled_detail=False, shop=shop)
        # 爬取商品详细信息
        for product in no_detail_product_list:
            self.downloader.download_and_parse_product_detail(product)

        logging.info('end craw_product_detail')

    # 使用ajax得到商品对象列表
    def get_product_list_from_shop_by_ajax(self, shop):
        # 得到一个商店的全部商品列表
        # 得到商店的html列表
        productList_html_list = self.downloader.download_productList_html_list_by_ajax(shop)
        # 得到商品列表
        product_list = self.parser.parse_productListHtml_list_to_product_list_by_ajax(productList_html_list, shop)

        logging.info(shop.name + '次页一共有' + str(len(product_list)) + '件商品')

        return product_list

    # 使用ajax爬取product
    def craw_product_by_ajax(self, shop_list):
        logging.info('start get product')
        for shop in shop_list:
            # 得到商品对象列表
            product_list = self.get_product_list_from_shop_by_ajax(shop)
            # 加入数据库
            self.controller.add_product_list(product_list)

    # 得到商品对象列表
    def get_product_list_from_shop(self, shop):
        # 得到一个商店的全部商品列表
        # 得到商店的html列表
        productList_html_list = self.downloader.download_productList_html_list(shop)
        # 得到商品列表
        product_list = self.parser.parse_productListHtml_list_to_product_list(productList_html_list, shop)

        logging.info(shop.name + '次页一共有' + str(len(product_list)) + '件商品')

        return product_list

    # 使用selenium爬取product
    def craw_product_by_selenium(self, shop_list):
        logging.info('start craw_product_by_selenium')
        no_detail_product_list = []
        for shop in shop_list:
            # 得到商品对象列表
            product_list = self.get_product_list_from_shop(shop)
            # 加入数据库,并返回需要爬取细节的product列表
            no_detail_product_list.extend(self.controller.add_product_list(product_list))

        logging.info('end craw_product_by_selenium')
        return no_detail_product_list



    # 爬取预先设置好的网站
    def craw_all_shop(self):
        print 'start****************'

        # 得到商店信息
        shop_list = Shop.objects.all()
        # 从商店中爬取商品列表并加入数据库
        no_detail_product_list = self.craw_product_by_selenium(shop_list)

        #self.csraw_product_by_ajax(shop_list)

        # 从数据库中得到未爬取商品，并获取详细信息
        self.craw_product_detail()

        print 'end****************'

    def craw_one_shop(self, shop_id):
        logging.info('start****************')
        shop = Shop.objects.get(id=shop_id)
        shop_list = [shop]
        # 从商店中爬取商品列表并加入数据库
        no_detail_product_list = self.craw_product_by_selenium(shop_list)
        # 从数据库中得到未爬取商品，并获取详细信息
        self.craw_one_shop_product_detail(shop)


if __name__ == '__main__':
    spider = SpiderMain()
    spider.craw_all_shop()
